package fr.auzaiphe.admin.model;

import fr.auzaiphe.admin.bdd.AlerteBDD;
import fr.auzaiphe.admin.bdd.BaseDeDonnee;
import fr.auzaiphe.admin.constantes.ConstantesAdmin;

/**
 *
 * @author Hugp
 * Classe d'alerte du scenario.
 *
 * Deux constructeurs pour deux types d'alertes :
 * 		- Le premier dans le cas ou l'alerte cible un joueur
 * 		- Le second ou l'alerte vise soit l'admin seulement (admin) ou l'interface de joueur non connectés (all)
 */
public class Alerte
{
	private AlerteBDD imageBDD;
	private int id;
	private boolean cibleAll;
	private boolean cibleAdmin;
	private Joueur cible;
	private ChronoAdmin chronoCible;
	private int activation;
	private Contenu contenu;
	private String titre;

	/**
	 * Constructeur d'une alerte ciblant un joueur.
	 * @param pJoueur Joueur à cibler par l'alerte
	 * @param pChrono Chrono à cibler par l'alerte
	 * @param pActivation Heure de l'activation de l'alerte par rapport au chrono
	 * @param pContenu Contenu de l'alerte
	 */
	public Alerte (BaseDeDonnee pBdd,
				   Joueur pJoueur,
				   ChronoAdmin pChrono,
				   int pActivation,
				   String pTitre,
				   Contenu pContenu)
	{
		this.id = -1;
		this.cibleAll = false;
		this.cibleAdmin = false;
		this.cible = pJoueur;
		this.chronoCible = pChrono;
		this.activation = pActivation;
		this.titre= pTitre;
		this.contenu = pContenu;
		this.chronoCible.addFlagAlertes(this, this.activation);
		this.imageBDD = new AlerteBDD(pBdd,this);
	}

	/**
	 * Constructeur d'une alerte ciblant seuelemnt l'admin ou l'interface joueur non connecté.
	 * @param pAdminOrAll Boolean indiquant l'interface à cibler :
	 * 				- 1 si l'interface admin est visé
	 * 				- 0 si l'interface de joueur non connecté est visé
	 * @param pChrono Chrono à cibler par l'alerte
	 * @param pActivation Heure de l'activation de l'alerte par rapport au chrono
	 * @param pContenu Contenu de l'alerte
	 */
	public Alerte (	BaseDeDonnee pBdd,
					Boolean pAdmin,
					Boolean pAll,
					ChronoAdmin pChrono,
					int pActivation,
					String pTitre,
					Contenu pContenu)
	{
		this.id = -1;
		this.cibleAll = pAdmin;
		this.cibleAdmin = pAll;
		this.cible = null;
		this.chronoCible = pChrono;
		this.activation = pActivation;
		this.titre= pTitre;
		this.contenu = pContenu;
		this.chronoCible.addFlagAlertes(this, this.activation);
		this.imageBDD = new AlerteBDD(pBdd,this);
	}

	/**
	 * Constructeur d'une alerte ciblant un joueur.
	 * @param pJoueur Joueur à cibler par l'alerte
	 * @param pChrono Chrono à cibler par l'alerte
	 * @param pActivation Heure de l'activation de l'alerte par rapport au chrono
	 * @param pContenu Contenu de l'alerte
	 */
	public Alerte (	int pId,
					BaseDeDonnee pBdd,
					Joueur pJoueur,
					ChronoAdmin pChrono,
					int pActivation,
					String pTitre,
					Contenu pContenu)
	{
		this.id = pId;
		this.cibleAll = false;
		this.cibleAdmin = false;
		this.cible = pJoueur;
		this.chronoCible = pChrono;
		this.activation = pActivation;
		this.titre= pTitre;
		this.contenu = pContenu;
		this.chronoCible.addFlagAlertes(this, this.activation);
		this.imageBDD = new AlerteBDD(pBdd,this);
	}

	/**
	 * Constructeur d'une alerte ciblant un joueur.
	 * @param pAdminOrAll Boolean indiquant l'interface à cibler :
	 * 				- 1 si l'interface admin est visé
	 * 				- 0 si l'interface de joueur non connecté est visé
	 * @param pChrono Chrono à cibler par l'alerte
	 * @param pActivation Heure de l'activation de l'alerte par rapport au chrono
	 * @param pContenu Contenu de l'alerte
	 */
	public Alerte (	int pId,
					BaseDeDonnee pBdd,
					Boolean pAdmin,
					Boolean pAll,
					ChronoAdmin pChrono,
					int pActivation,
					String pTitre,
					Contenu pContenu)
	{
		this.id = pId;
		this.cibleAll = pAll;
		this.cibleAdmin = pAdmin;
		this.cible = null;
		this.chronoCible = pChrono;
		this.activation = pActivation;
		this.titre= pTitre;
		this.contenu = pContenu;
		this.chronoCible.addFlagAlertes(this, this.activation);
		this.imageBDD = new AlerteBDD(pBdd,this);
	}

	public void supprimer()
	{
		this.imageBDD.supprimer();
	}

	public String getNomAlerte()
	{
		return this.titre;
	}

	public boolean isTargetingAll()
	{
		return this.cibleAll;
	}

	public boolean isTargetingAdmin()
	{
		return this.cibleAdmin;
	}

	public Contenu getContenu()
	{
		return this.contenu;
	}

	public int getHeureAffiche()
	{
		return this.activation;
	}

	public String getTexte()
	{
		return this.contenu.getTexte();
	}

	public String getLienFichier()
	{
		return this.contenu.getLienFichier();
	}

	/**
	 * @return the id
	 */
	public int getId() {
		return this.id;
	}

	/**
	 * @param id the id to set
	 */
	public void setId(int id) {
		this.id = id;
	}

	/**
	 * @return the activation
	 */
	public int getActivation() {
		return this.activation;
	}

	/**
	 * @param activation the activation to set
	 */
	public void setActivation(int activation) {
		this.activation = activation;
	}

	/**
	 * @return the titre
	 */
	public String getTitre() {
		return this.titre;
	}

	/**
	 * @return la cible de l'alerte
	 */
	public Joueur getCible(){
		return this.cible;
	}

	/**
	 * @param titre the titre to set
	 */
	public void setTitre(String titre) {
		this.titre = titre;
	}

	/**
	 *
	 * @return soit le joueur ciblé, soit l'admin soit tlm
	 */
	public String getCibleAlerte()
	{
		if(this.cibleAll) return ConstantesAdmin.AJOUT_ALERTE_CHOIX_CIBLE[0];
		if(this.cibleAdmin) return ConstantesAdmin.AJOUT_ALERTE_CHOIX_CIBLE[1];
		else return this.cible.getNomPersonnage()+" "+this.cible.getPrenomPersonnage();
	}

	public ChronoAdmin getChronoCible()
	{
		return this.chronoCible;
	}

	/**
	 * Check si une alerte du même nom existe déjà. (Titre devient identifiant unique)
	 * @param alr alerte à comparer
	 * @return true si même titre
	 */
	public boolean equals(Alerte alr)
	{
		return
				this.titre.equals(alr.getTitre());
	}

	/**
	 * @param cibleAll the cibleAll to set
	 */
	public void setCibleAll(boolean cibleAll)
	{
		this.cibleAll = cibleAll;
	}

	/**
	 * @param cibleAdmin the cibleAdmin to set
	 */
	public void setCibleAdmin(boolean cibleAdmin)
	{
		this.cibleAdmin = cibleAdmin;
	}

	/**
	 * @param cible the cible to set
	 */
	public void setCible(Joueur cible)
	{
		this.cible = cible;
	}

	/**
	 * @param chronoCible the chronoCible to set
	 */
	public void setChronoCible(ChronoAdmin chronoCible)
	{
		this.chronoCible = chronoCible;
	}

	/**
	 * @param contenu the contenu to set
	 */
	public void setContenu(Contenu contenu)
	{
		this.contenu = contenu;
	}

	/**
	 * @return the imageBDD
	 */
	public AlerteBDD getImageBDD()
	{
		return this.imageBDD;
	}

	/**
	 * @return temps restant avant affichage
	 */
	public int getTempsRestant()
	{
		return this.chronoCible.getSecondesRestantes()-this.activation;
	}
}
